package com.leesk.trial.springbootdatastatistics.service;

import com.leesk.trial.springbootdatastatistics.pojo.Country;
import com.leesk.trial.springbootdatastatistics.pojo.Province;
import com.leesk.trial.springbootdatastatistics.pojo.RegionStats;
import com.leesk.trial.springbootdatastatistics.util.CsvUtil;
import com.leesk.trial.springbootdatastatistics.util.TransferUtil;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author: leesk
 * @Description:
 * @Date: Create in 20:46 2020/11/19
 *
 *
 *  生命周期接口：InitializingBean（学会灵活使用）
 *  spring容器每次刷新都会检查每一个bean的类是否有实现这个接口，若有，则这个类需实现一个生命回调函数
 *  且这个函数会在这个类的所有bean都填充完毕后再调用，并在这个bean的生命周期里只调用一次
 */

@Service
public class CoronaVirusDataService implements InitializingBean{
    private static final String CoronaVirusDataURL = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/11-18-2020.csv";
    private List<Country> countries = new ArrayList<>();


    public List<Country> getCountries() {
        return countries;
    }

    /**
     * 使用Spring框架自带的计划任务功能定时更新统计数据
     * 前提：首先通过在配置类上添加 @EnableScheduling 注解来开启对计划任务的支持
     * <p>
     * 此处在要执行计划任务的方法上注解 @Scheduled，声明这是一个计划任务
     *
     * @throws IOException
     * @Description:设置每天凌晨1点半第5秒的时候更新allRegionStats成员变量（这个变量存储着全球新型冠状病毒统计数据）
     */
    //  例1
    //  @Scheduled(cron = "5 30 1 * * *")
    //  例2：将设置的计划时间配置于属性文件里，这样我们在有更改时间需求的时候可更为便捷地完成任务
    @Scheduled(cron = "${leesk.Schedules.updateVirusDataCron}")
    public void updateCoronaVirusData() throws IOException {
        List<RegionStats> allRegionStats = new ArrayList<>();
        TransferUtil.transferToChinese(allRegionStats);
        InputStream inputStream = CsvUtil.fetchCoronaVirusData(CoronaVirusDataURL);
        allRegionStats = CsvUtil.getCoronaVirusData(inputStream);
        countries = CsvUtil.addProvinceAndCountry(allRegionStats);
    }

    /**
     * 实现Bean的生命回调函数
     * 当应用程序启动时，执行updateCoronaVirusData()，初始化成员变量allRegionStats
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        updateCoronaVirusData();
    }

    public List<Province> getProvince(String countryName){
        List<Province> provinceList = new ArrayList<>();
        Country country = null;
        for (Country c : countries) {
            if(c.getCountry().equals(countryName)){
                country = c;
            }
        }
        if(country != null){
            provinceList = country.getProvinceList();
        }
        return provinceList;
    }
}
